import socket
import re
import multiprocessing


def handle_client(new_sock):
    request = new_sock.recv(1024).decode('utf-8')
    #讲请求报文分行存在列表中
    request_lines=request.splitlines()
    file_name = ''
    #request_lines[0]这是请求行，GET /index.html HTTP/1.1
    #这里[^/]表示不包含/的字符，+表示至少一个
    #(/[^ ]*)表示以分组来匹配第一个字符是/，然后不包含空格的0到多个字符
    #[^/]+(/[^ ]*)最后只有一组/index.htm，因此匹配到的值应该至少有/，不为空
    ret = re.match(r'[^/]+(/[^ ]*)',request_lines[0])
    file_name = ret.group(1)
    print('Filename is '+file_name)
    if file_name == '/':
        file_name = '/index.html'

    try:
        f = open('./html'+file_name,'rb')
    except:
        response = 'HTTP/1.1 404 NOT FOUND\r\n'
        response+='\r\n'
        response+='-----file not found------'
        new_sock.send(response.encode('utf-8'))
    else:
        html_content = f.read()
        f.close()
        response = 'HTTP/1.1 200 OK\r\n'
        response+='\r\n'
        new_sock.send(response.encode('utf-8'))
        new_sock.send(html_content)
    new_sock.close()


def main():
    tcp_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    tcp_server_socket.bind(('127.0.0.1',8000))
    tcp_server_socket.listen(128)
    while 1:
        new_sock,client_addr=tcp_server_socket.accept()
        p = multiprocessing.Process(target=handle_client,args=(new_sock,))
        p.start()
        #因为新进程再创建过程中会完全复制父进程的运行环境，所以父进程中关闭的只是自己环境中的套接字对象
        #而新进程中因为被复制的环境中是独立存在的，所以不会受到影响，其实就是当创建新进程后会复制主进程的资源（再新建一个引用），这样当关闭主进程里的new_socket时子进程仍存在一个引用
        new_sock.close()
    #关闭监听套接字
    tcp_server_socket.close()


if __name__=='__main__':
    main()




